import psutil  
import subprocess  
import time  
from prettytable import PrettyTable  
  
# 设置警报阈值  
CPU_THRESHOLD = 90  # CPU使用率阈值（百分比）  
MEMORY_THRESHOLD = 90  # 内存使用率阈值（百分比）  
DISK_THRESHOLD = 90  # 磁盘使用率阈值（百分比，针对根目录）  
NETWORK_THRESHOLD = 100 * 1024 * 1024  # 网络接收/发送阈值（字节/秒，例如1 Mbps）  
  
# 检查ECC错误的函数（假设dmesg中有相关信息）  
def check_ecc_errors():  
    try:  
        # 运行dmesg命令，查找ECC错误相关的行（这取决于你的系统输出，可能需要调整）  
        output = subprocess.check_output("dmesg | grep -i 'ecc' | grep -i 'corrected'", shell=True)  
        if output:  
            return True, output.decode().strip()  
    except subprocess.CalledProcessError:  
        pass  
    return False, None  
  
# 获取CPU使用率的函数  
def get_cpu_usage():  
    return psutil.cpu_percent(interval=1)  
  
# 获取内存使用率的函数  
def get_memory_usage():  
    memory = psutil.virtual_memory()  
    return memory.percent  
  
# 获取磁盘使用率的函数  
def get_disk_usage(mountpoint='/'):  
    disk = psutil.disk_usage(mountpoint)  
    return disk.percent  
  
# 获取网络接口流量的函数  
def get_network_usage(interface='eth0'):  
    # 获取指定网络接口的流量信息（接收和发送的字节数）  
    net_io = psutil.net_io_counters(pernic=True)[interface]  
    return net_io.bytes_recv, net_io.bytes_sent  
  
# 检查并显示硬件状态的函数  
def check_and_display_hardware_status():  
    # 创建一个表格来显示状态信息  
    table = PrettyTable()  
    table.field_names = ["Component", "Status"]  
  
    # 检查CPU使用率  
    cpu_usage = get_cpu_usage()  
    cpu_status = f"OK ({cpu_usage}%)" if cpu_usage < CPU_THRESHOLD else f"CRITICAL ({cpu_usage}%)"  
    table.add_row(["CPU", cpu_status])  
  
    # 检查内存使用率  
    memory_usage = get_memory_usage()  
    memory_status = f"OK ({memory_usage}%)" if memory_usage < MEMORY_THRESHOLD else f"CRITICAL ({memory_usage}%)"  
    table.add_row(["Memory", memory_status])  
  
    # 检查磁盘使用率  
    disk_usage = get_disk_usage()  
    disk_status = f"OK ({disk_usage}%)" if disk_usage < DISK_THRESHOLD else f"CRITICAL ({disk_usage}%)"  
    table.add_row(["Disk", disk_status])  
  
    # 检查ECC错误  
    ecc_error, ecc_error_msg = check_ecc_errors()  
    ecc_status = "OK" if not ecc_error else f"CRITICAL - ECC Error Detected: {ecc_error_msg}"  
    table.add_row(["Memory ECC", ecc_status])  
  
    # 检查网络接口流量（这里只是简单地检查是否有流量，你可能需要更复杂的逻辑来检测异常流量）  
    recv, sent = get_network_usage()  
    network_status = "OK"  # 你可以添加逻辑来根据recv和sent的值判断网络状态是否正常  
    table.add_row(["Network", network_status])  
  
    # 打印表格显示状态信息  
    print(table)  
    if ecc_error or cpu_usage >= CPU_THRESHOLD or memory_usage >= MEMORY_THRESHOLD or disk_usage >= DISK_THRESHOLD:  
        print("WARNING: One or more components are in CRITICAL state!")  
  
# 主函数  
def main():  
    while True:  
        check_and_display_hardware_status()  
        time.sleep(10)  # 每10秒检查一次硬件状态（你可以根据需要调整这个时间间隔）  
  
if __name__ == '__main__':  
    main()